package com.trace.demo.repository;

import com.trace.demo.entity.OperationLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 操作日志数据访问接口
 */
@Repository
public interface OperationLogRepository extends JpaRepository<OperationLog, Long>, JpaSpecificationExecutor<OperationLog> {
    
    /**
     * 根据用户ID查询操作日志
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    Page<OperationLog> findByUserId(Long userId, Pageable pageable);
    
    /**
     * 根据模块名称查询操作日志
     * @param module 模块名称
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    Page<OperationLog> findByModule(String module, Pageable pageable);
    
    /**
     * 根据操作类型查询操作日志
     * @param action 操作类型
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    Page<OperationLog> findByAction(String action, Pageable pageable);
    
    /**
     * 根据操作结果查询操作日志
     * @param result 操作结果
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    Page<OperationLog> findByResult(Boolean result, Pageable pageable);
    
    /**
     * 根据操作时间范围查询操作日志
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    Page<OperationLog> findByOperationTimeBetween(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
    
    /**
     * 根据用户名或操作描述模糊查询
     * @param keyword 关键词
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    @Query("SELECT o FROM OperationLog o WHERE o.userName LIKE %:keyword% OR o.description LIKE %:keyword%")
    Page<OperationLog> findByUserNameOrDescriptionContaining(@Param("keyword") String keyword, Pageable pageable);
    
    /**
     * 复合条件查询操作日志
     * @param userName 用户名
     * @param module 模块名称
     * @param action 操作类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param result 操作结果
     * @param pageable 分页参数
     * @return 操作日志分页结果
     */
    @Query("SELECT o FROM OperationLog o WHERE " +
           "(:userName IS NULL OR o.userName LIKE %:userName%) AND " +
           "(:module IS NULL OR o.module = :module) AND " +
           "(:action IS NULL OR o.action = :action) AND " +
           "(:startTime IS NULL OR o.operationTime >= :startTime) AND " +
           "(:endTime IS NULL OR o.operationTime <= :endTime) AND " +
           "(:result IS NULL OR o.result = :result)")
    Page<OperationLog> findByConditions(
            @Param("userName") String userName,
            @Param("module") String module,
            @Param("action") String action,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("result") Boolean result,
            Pageable pageable);
    
    /**
     * 清空所有操作日志
     */
    @Modifying
    @Query("DELETE FROM OperationLog")
    void deleteAllLogs();
} 